package com.huanmeiqi.drools.demo.quickstart;

import org.junit.jupiter.api.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 * @author cq.Wang
 * @date 2018/7/5 18:47
 * @description
 */
public class DroolsTest {
    @Test
    public void testRules() {
        /**
         * KieServices接口提供了很多方法，可以通过这些方法访问KIE关于构建和运行的相关对象，比如说可以获取KieContainer，
         * 利用KieContainer来访问KBase和KSession等信息；可以获取KieRepository对象，利用KieRepository来管理KieModule等。
         * KieServices就是一个中心，通过它来获取的各种对象来完成规则构建、管理和执行等操作.
         */
        KieServices ks = KieServices.Factory.get();// 通过单例创建KieServices

        /**
         * KieRepository是一个单例对象，它是存放KieModule的仓库，KieModule由kmodule.xml文件定义（当然不仅仅只是用它来定义）。
         */
        KieRepository kieRepository = ks.getRepository();

        /**
         * 可以理解KieContainer就是一个KieBase的容器。提供了获取KieBase的方法和创建KieSession的方法。
         * 其中获取KieSession的方法内部依旧通过KieBase来创建KieSession
         */
        KieContainer kieContainer = ks.getKieClasspathContainer();

        /**
         * KieBase就是一个知识仓库，包含了若干的规则、流程、方法等，在Drools中主要就是规则和方法，KieBase本身并不包含运行时的数据之类的，
         * 如果需要执行规则KieBase中的规则的话，就需要根据KieBase创建KieSession
         * 获取KieBase正常流程
         * KieBase kieBase = kieContainer.getKieBase();
         * KieSession kieSession = kieBase.newKieSession();
         * StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();
         * KieSession就是一个跟Drools引擎打交道的会话，其基于KieBase创建，它会包含运行时数据，包含“事实Fact”，并对运行时数据实时进行规则运算。
         * 创建KieBase是一个成本非常高的事情，KieBase会建立知识（规则、流程）仓库，而创建KieSession则是一个成本非常低的事情，所以KieBase会建立缓存，而KieSession则不必。
         */
        KieSession kieSession = kieContainer.newKieSession("ksession-rule");// 获取kmodule.xml中配置中名称为ksession-rule的session，默认为有状态的

        Boy boy = new Boy();
        boy.setAge(17);
        kieSession.insert(boy);
        int count = kieSession.fireAllRules();
        System.out.println("命中了" + count + "条规则！");
        System.out.println("男孩是否允许进入网吧" + boy.getEnterInternetCafe());

    }
}
